package com.acmen.easyapi.parse;

import com.acmen.easyapi.model.ReqParamNode;
import com.acmen.easyapi.util.SpringContextUtil;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;


/**
 * 接口详细说明表格工具
 *
 * @author acmen
 */
@Component
public class RequestParser {
    @Resource
    private RequestHeaderParser requestHeaderParser;
    @Resource
    private PathVariableParser pathVariableParser;
    @Resource
    private RequestParamParser requestParamParser;
    @Resource
    private RequestBodyParser requestBodyParser;


    public static final RequestParser getInstance() {
        return SpringContextUtil.getBean(RequestParser.class);
    }

    public ReqParamNode createParamNode(Method method) {
                // 创建根节点
        ReqParamNode rootNode = new ReqParamNode();
        // 设置根节点名称为"request"
        rootNode.setName("request");
        // 设置根节点标签为"请求"
        rootNode.setLabel("请求");
        // 设置根节点子节点列表为空列表
        rootNode.setSubNodes(new ArrayList<>());

        // 解析请求头，并生成请求头子节点列表
        List<ReqParamNode> headers = requestHeaderParser.createParamNodes(method);
        // 如果请求头子节点列表不为空
        if(!headers.isEmpty()){
            // 创建请求头子节点
            ReqParamNode headerNode = new ReqParamNode();
            // 设置请求头子节点名称为"headers"
            headerNode.setName("headers");
            // 设置请求头子节点名称为"请求头"
            headerNode.setName(ReqParamNode.NODE_HEADER);
            // 设置请求头子节点标签为"请求头"
            headerNode.setLabel("请求头");
            // 设置请求头子节点子节点列表为请求头子节点列表
            headerNode.setSubNodes(headers);
            // 将请求头子节点添加到根节点的子节点列表中
            rootNode.getSubNodes().add(headerNode);
        }

        // 解析请求路径变量，并生成请求路径变量子节点列表
        List<ReqParamNode> pathVariables = pathVariableParser.createParamNodes(method);
        // 如果请求路径变量子节点列表不为空
        if(!pathVariables.isEmpty()){
            // 创建请求路径变量子节点
            ReqParamNode pathVariableNode = new ReqParamNode();
            // 设置请求路径变量子节点名称为"请求路径变量"
            pathVariableNode.setName(ReqParamNode.NODE_PATH_VAR);
            // 设置请求路径变量子节点标签为"请求路径变量"
            pathVariableNode.setLabel("请求路径变量");
            // 设置请求路径变量子节点子节点列表为请求路径变量子节点列表
            pathVariableNode.setSubNodes(pathVariables);
            // 将请求路径变量子节点添加到根节点的子节点列表中
            rootNode.getSubNodes().add(pathVariableNode);
        }

        // 解析请求参数，并生成请求参数子节点列表
        List<ReqParamNode> params = requestParamParser.createParamNodes(method);
        // 如果请求参数子节点列表不为空
        if(!params.isEmpty()){
            // 创建请求参数子节点
            ReqParamNode paramNode = new ReqParamNode();
            // 设置请求参数子节点名称为"请求参数"
            paramNode.setName(ReqParamNode.NODE_PARAM);
            // 设置请求参数子节点标签为"请求参数"
            paramNode.setLabel("请求参数");
            // 设置请求参数子节点子节点列表为请求参数子节点列表
            paramNode.setSubNodes(params);
            // 将请求参数子节点添加到根节点的子节点列表中
            rootNode.getSubNodes().add(paramNode);
        }

        // 解析请求体，并生成请求体节点
        ReqParamNode body = requestBodyParser.createParamNode(method);
        // 如果请求体节点不为空
        if(body!=null){
            // 将请求体节点添加到根节点的子节点列表中
            rootNode.getSubNodes().add(body);
        }

        // 返回根节点
        return rootNode;

    }
}
